#ifndef FONCTION_HPP
#define FONCTION_HPP

#include "Point.hpp"

#include <boost/numeric/ublas/matrix.hpp>

typedef boost::numeric::ublas::matrix< double > MatriceBase;

namespace CalculIntegral
{
  typedef double(*FonctionElementaire)( const double&, const double& );

  typedef boost::numeric::ublas::matrix< FonctionElementaire > MatriceFct;

  /**
   * Classe qui implémente les fonctions de \f$ \mathbb{R}^n \f$ dans
   * \f$ \mathbb{R}^m \f$.
   *
   * @author Johan "Solo" Luisier
   * @date 2 Août 2011
   */
  class Fonction
  {
  public:
    Fonction( const MatriceFct& fcts );
    Fonction( FonctionElementaire fct/*double (*fct)( const double& val,
			    const double& t )*/ );
    virtual ~Fonction();
    const unsigned& nbrLignes() const;
    const unsigned& nbrColonnes() const;
    MatriceBase operator()( const Point& val, const Point& t ) const;
  protected:
    MatriceFct MatriceDerivee;
  private:
    unsigned NbrLignes, NbrColonnes;
  };

}

#endif // FONCTION_HPP
